package com.vehiclemanagement.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vehiclemanagement.entity.InsuranceRecord;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 车辆保险记录服务接口
 */
public interface InsuranceRecordService extends IService<InsuranceRecord> {

    /**
     * 分页查询保险记录
     *
     * @param current       当前页
     * @param size          每页大小
     * @param searchTerm    搜索关键词
     * @param vehicleId     车辆ID
     * @param insuranceType 保险类型
     * @param status        保险状态
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @return 分页结果
     */
    IPage<InsuranceRecord> pageInsurances(Integer current, Integer size, String searchTerm,
                                        Long vehicleId, Integer insuranceType, Integer status,
                                        LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据ID获取保险记录
     *
     * @param id 记录ID
     * @return 保险记录
     */
    InsuranceRecord getInsuranceById(Long id);

    /**
     * 添加保险记录
     *
     * @param insurance 保险记录
     * @return 添加结果
     */
    boolean addInsurance(InsuranceRecord insurance);

    /**
     * 更新保险记录
     *
     * @param insurance 保险记录
     * @return 更新结果
     */
    boolean updateInsurance(InsuranceRecord insurance);

    /**
     * 删除保险记录
     *
     * @param id 记录ID
     * @return 删除结果
     */
    boolean deleteInsurance(Long id);

    /**
     * 更新所有保险状态
     * 根据到期时间自动更新保险状态:
     * 1-有效，2-即将到期(30天内)，3-已过期
     *
     * @return 更新的记录数
     */
    int updateAllInsuranceStatus();

    /**
     * 获取即将到期的保险记录
     *
     * @param days 天数，如获取30天内即将到期的保险
     * @return 即将到期的保险记录列表
     */
    List<InsuranceRecord> getExpiringInsurance(Integer days);

    /**
     * 获取已过期的保险记录
     *
     * @return 已过期的保险记录列表
     */
    List<InsuranceRecord> getExpiredInsurance();

    /**
     * 增加理赔次数和金额
     *
     * @param id          保险记录ID
     * @param claimAmount 理赔金额
     * @return 是否成功
     */
    boolean addClaim(Long id, BigDecimal claimAmount);

    /**
     * 计算指定车辆的总保费
     *
     * @param vehicleId 车辆ID
     * @return 总保费
     */
    BigDecimal sumPremiumByVehicleId(Long vehicleId);

    /**
     * 统计指定车辆的保险数量
     *
     * @param vehicleId 车辆ID
     * @return 保险数量
     */
    Integer countInsuranceByVehicleId(Long vehicleId);

    /**
     * 按保险类型统计保费和保险金额
     *
     * @return 保险类型统计结果
     */
    List<Map<String, Object>> statisticsByType();

    /**
     * 按年份统计保费和保险金额
     *
     * @return 年份统计结果
     */
    List<Map<String, Object>> statisticsByYear();
} 